#include "jsapi.h"
#include "js-engine.h"
#include "desktopClasses.h"

static JSBool menu_new(JSContext *cx, JSObject *obj, uintN argc, jsval *args, jsval *rval);

static JSBool menu_AddItem(JSContext *cx, JSObject *obj, uintN argc, jsval *args, jsval *rval);
static JSBool menu_SetItemStyle(JSContext *cx, JSObject *obj, uintN argc, jsval *args, jsval *rval);
static JSBool menu_AddPopup(JSContext *cx, JSObject *obj, uintN argc, jsval *args, jsval *rval);

static JSFunctionSpec menu_methods[] = {
    {"AddItem", menu_AddItem, 3, 0, 0}, 
    {"SetItemStyle", menu_SetItemStyle, 2, 0, 0}, 
    {"AddPopup", menu_AddPopup, 1, 0, 0}, 
    {NULL, NULL, 0, 0, 0}
};

static JSClass menuClass =
    { "menu", JSCLASS_HAS_PRIVATE,
      JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
      JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
      JSCLASS_NO_OPTIONAL_MEMBERS
    };

static JSBool menu_new(JSContext *cx, JSObject *obj, uintN argc, jsval *args, jsval *rval)
{
    g_message("menu new");
    return JS_TRUE;
}

static JSBool menu_AddItem(JSContext *cx, JSObject *obj, uintN argc, jsval *args, jsval *rval)
{
    g_return_val_if_fail(argc == 3, JS_FALSE);
    g_message("menu_AddItem called.");
    return JS_TRUE;
}

static JSBool menu_SetItemStyle(JSContext *cx, JSObject *obj, uintN argc, jsval *args, jsval *rval)
{
    g_return_val_if_fail(argc == 2, JS_FALSE);
    return JS_TRUE;
}

static JSBool menu_AddPopup(JSContext *cx, JSObject *obj, uintN argc, jsval *args, jsval *rval)
{
    g_return_val_if_fail(argc == 1, JS_FALSE);
    return JS_TRUE;
}

JSObject *menuClass_init(js_engine *engine)
{
    JSObject *proto = NULL;
    proto = JS_InitClass(engine->cx, engine->glob, NULL,
			 &menuClass, menu_new,
			 0,NULL,NULL,NULL,NULL);
    g_return_val_if_fail(proto, FALSE);
    g_return_val_if_fail(JS_DefineFunctions(engine->cx, proto, menu_methods), FALSE);
    return proto;
}
